#include <iostream>
#include <string>
using namespace std;

class Pet {
	string pname;
public:
	Pet(const string& petName) : pname(petName) {}
	
	virtual string name() const { return pname; }
	
	virtual string speak() const { return ""; }
	
};


class Dog : public Pet {
	string name;
public:
	Dog(const string& petName) : Pet(petName) {}
	
	virtual string sit() const { return Pet::name() + " sits"; } // New virtual function 
	
	string speak() const{ return Pet::name() + " says 'Bark!'"; } // Override
};


int main() {
	/*
		对于基类中的所有virtual方法，会存储在一个虚方法表vtable中（存储一系列指向方法的指针）
		之后，会根据具体的情况，将虚方法表中的指针，指向具体的实现函数
	*/
	Pet* p[] = {new Pet("generic"), new Dog("bob")};
	cout << "p[0]->speak() = " << p[0]->speak() << endl;
	cout << "p[1]->speak() = " << p[1]->speak() << endl;
	//! cout << “p[1]->sit() = ” << p[1]->sit() << endl; // Illegal Pet类型中的虚方法表中，没有sit方法
}